package com.share.shrimpcolo.shoot02.sync;

import java.io.File;
import java.util.Scanner;

/**
 * （25分）用线程实现一个上弹夹开枪射击的过程要把子弹用完，一共有3个弹夹，每个弹夹有12发子弹。（用到线程锁） 运行出来应该是： 上弹夹，枪内有12发子弹
 * 进行一次射击，还剩11发子弹 进行一次射击，还剩10发子弹 进行一次射击，还剩9发子弹 进行一次射击，还剩8发子弹 进行一次射击，还剩7发子弹
 * 进行一次射击，还剩6发子弹 进行一次射击，还剩5发子弹 进行一次射击，还剩4发子弹 进行一次射击，还剩3发子弹 进行一次射击，还剩2发子弹
 * 进行一次射击，还剩1发子弹 进行一次射击，还剩0发子弹 没有子弹了，请换弹夹 上弹夹，枪内有12发子弹 进行一次射击，还剩11发子弹 …… …… ……
 * 
 * @author Johnny Tam
 *
 *         使用sync 方法
 */
public class ShootExe02Sync implements Runnable {

	private static final int BULLET_NUMBER = 12;
	private Thread shooter = null;
	private int cartridge = 3;
	private int currentNumber = BULLET_NUMBER;
	
	public static void main(String[] args) {
		ShootExe02Sync demoShoot = new ShootExe02Sync();
		demoShoot.startShoot();
	}

	public void startShoot() {
		if (null == shooter) {
			shooter = new Thread(this);
			shooter.setName("shoot bullets");
			shooter.start();

		}
	}

	public synchronized void stopShoot() {
		if (null != shooter) {
			shooter.interrupt();
		}
		shooter = null;
		notifyAll();
	}


	@Override
	public void run() {
		Thread thread = Thread.currentThread();
		while (thread == shooter) {
			try {
				Thread.sleep(300);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}

			if (cartridge > 0) {
				if (currentNumber == BULLET_NUMBER) {
					System.out.println("上弹夹, 枪内有12发子弹");
				}

				currentNumber--;
				System.out.println("进行一次射击，还剩" + currentNumber + "发子弹");

				if (currentNumber == 0) {
					System.out.println("没有子弹了，请换弹夹");
					cartridge--;
					currentNumber = BULLET_NUMBER;
				}
			} else {
				System.out.println("所有弹夹都打完了！！！");
				stopShoot();
			}

		}

	}// end run

}
